package com.linkai.注解和反射.reflect;

/**
 * @Description: 测试类什么时候会初始化（了解类的加载刘鹗长）
 * @Author: 林凯
 * @Date: 2021/10/21 17:21
 */
public class Test06 {

    static {
        System.out.println("Main类被加载");
    }

    public static void main(String[] args) throws ClassNotFoundException {
        // 1. 主动引用
//        Son son = new Son();

        // 反射也产生主动引用
//        Class.forName("com.linkai.注解和反射.reflect.Son");

        // 2. 不会产生类的引用的方法
        /*
            因为下面这些情况，变量都是在“链接”阶段就已经被赋予了初始值，位于方法区中
        * */
        // 子类引用父类的静态变量，不会导致子类初始化
        System.out.println(Son.b);
        // 通过数组定义类的引用，也不会触发该类的初始化
        Son[] array = new Son[10];
        // 引用常量也不会触发类的初始化（常量在链接阶段就存入调用类的常量池中了）
        System.out.println(Son.M);

    }
}

class Father {

    static int b = 2;

    static {
        System.out.println("父类被加载");
    }
}

class Son extends Father {
    static {
        System.out.println("子类被加载");
        m = 300;
    }

    static int m = 100;
    static final int M = 1;
}